/*
  Widget
  是显示元素Element的配置数据
  一个Widget对象可以对应多个Element对象

  特点：
  1.一切皆Widget，应用本身也是Widget
  2.组合大于继承

  Key
  Widget的唯一标识，每次刷新UI，都会重新构建新的Widget树，并和之前的树对比，计算出变化的部分
  这个过程就是 diff ，如果key没有变，则说明没有变化

  Key有两种：
  local key
  global key
  用处：不重新创建新对象和获得控件对象


  StatelessWidget
  用于组合并封装多个控件，而且不需要维护数据状态，所以类的成员变量用final修饰
  继承StatelessWidget，重写build函数
  没有生命周期

  StatefulWidget
  用于组合并封装多个控件，需要根据数据改变控件状态
  继承StatefulWidget，然后新建一个类，继承State
  有生命周期（在State类里）：initState、didChangeDependencies等等

  热重载只会调用build方法，当修改其他地方需要重新运行

  为什么build()方法放在State（而不是StatefulWidget）中
  主要是为了提高开发的灵活性，以后再体会
 */

import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
  home:
  HomePage(text: 'haha'),
));

/*
  无状态控件
 */
class HomePage extends StatelessWidget {

  // 用final修饰
  final int count;

  final String text;

  // 构造函数参数应使用命名参数
  const HomePage({
    Key? key,  // 第一个参数一般是Key
    required this.text,  // 必要参数
    this.count =0
  }):super(key: key);

  @override
  Widget build(BuildContext ctx) {
    return Scaffold(
      body: TextButton(child: Text(text), onPressed: (){
        // 不能改变控件状态
      },),
    );
  }
}

/*
  有状态控件
 */
class MyW extends StatefulWidget {

  // 用于创建和Stateful widget相关的状态，它在Stateful widget的生命周期中可能会被多次调用。
  @override
  _MyWState createState() => _MyWState();
}

// with 实现类似多继承的功能,所以with后可以接好几个类
class _MyWState extends State<MyW> with WidgetsBindingObserver {

  void _generate() {
    // 当前Widget的上下文
    Navigator.of(this.context).pop();
  }

  @override
  void initState() {
    super.initState();
    // 调试打印，release版本里不会打印
    debugPrint('初始化，只会被调用一次');
  }

  @override
  void dispose() {
    super.dispose();
    debugPrint('被移除时调用');
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    // 当依赖变化时回调，紧跟initState之后
  }

  // App的生命周期，要混入WidgetsBindingObserver类
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.resumed:
        debugPrint('resumed');
        break;
      case AppLifecycleState.paused:
        debugPrint('paused');
        break;
      case AppLifecycleState.inactive:
        debugPrint('inactive');
        break;
      case AppLifecycleState.detached:
        debugPrint('inactive');
        break;
    }
  }

  // build 参数context是全局根Widget上下文
  @override
  Widget build(BuildContext ctx) {
    return Container(
      child: TextButton(child: Text('haha'), onPressed: () {
        setState(() {
          // 重新构建渲染树，这里需要改变数据
        });
      },),
    );
  }
}

